<?php

namespace common\helps;
/**
 * 自定义的全局的公共的方法
 * @author Administrator
 *
 */
class Tools
{
    /**
     * 新建文件夹，实现级联创建文件夹
     * @param unknown $dir
     * @param number $mode
     * @return boolean
     */
    public static function mkdirs($dir, $mode = 0777)
    {
        if (is_dir($dir) || @mkdir($dir, $mode)) return true;
        if (!Tools::mkdirs(dirname($dir), $mode)) return false;

        return @mkdir($dir, $mode);
    }

    /**
     * 根据月日分计算并创建目录
     * @return string
     */
    public static function mk_dir_bytime()
    {
        $dir = date('y/md', time());
        if (is_dir('./' . $dir)) {
            return $dir;
        } else {
            mkdir('./' . $dir, 0777, true);
            return $dir;
        }
    }

    /**
     * 随机生成移动后的文件名
     */
    public static function randName()
    {
        $str = 'abcdefghijkmnpqrstwxyz23456789';
        return substr(str_shuffle($str), 0, 6);
    }

    /**
     * 转换一个String字符串为byte数组
     * @param $str 需要转换的字符串
     * @param $bytes 目标byte数组
     * @author yufei
     */
    public static function getBytes($string)
    {
        $bytes = array();
        for ($i = 0; $i < strlen($string); $i++) {
            $bytes[] = ord($string[$i]);
        }
        return $bytes;
    }

    /**
     * 转换一个String字符串为byte数组
     * @param $str 需要转换的字符串
     * @param $bytes 目标byte数组
     * @author yufei
     */
    public static function getArrays($string)
    {
        $bytes = array();
        for ($i = 0; $i < strlen($string); $i++) {
            $bytes[] = $string[$i];
        }
        return $bytes;
    }

    /**
     * 转换一个String字符串为byte数组
     * @param $str 需要转换的字符串
     * @param $bytes 目标byte数组
     * @author yufei
     */
    public static function setByteToString($audioData)
    {
        $str = "";
        for ($i = 0; $i < strlen($audioData); $i++) {
            $str .= ord($audioData[$i]);
        }
        return $str;
    }

    /*
     * 等同于javaScript中的 new Date().toUTCString();
     */
    public static function toGMTString($time)
    {
        return gmdate("D, d M Y H:i:s", $time) . ' GMT';
    }

    /**
     * 返回16位md5值
     *
     * @param string $str 字符串
     * @return string $str 返回16位的字符串
     */
    public static function shortMd5($str)
    {
        return substr(md5($str), 8, 16);
    }


    /**
     * 写日志方法，用于调试
     * @param $str
     */
    public static function writeToLog($str)
    {
        if (YII_DEBUG) {
            file_put_contents("console.log", date("y年m月d日: H:i:s  ", time()) . @var_export($str, true) . "\r\n\r\n" . PHP_EOL, FILE_APPEND);
        }
    }

    public static function l($str)
    {
        if (YII_DEBUG) {
            file_put_contents("console.log", date("y年m月d日: H:i:s  ", time()) . @var_export($str, true) . "\r\n\r\n" . PHP_EOL, FILE_APPEND);
        }
    }


    /**
     * 将数组转化为xml文档
     * @param $arr 要转化为的数组
     * @param int $dom
     * @param int $item
     * @return mixed
     */
    static function arrtoxml($arr, $node = 'include', $node1 = "menu")
    {
        if ($node == 'include') {
            $simpleXmlElemnet = new \SimpleXMLElement('<?xml version="1.0" encoding="gbk"?><include></include>');
        } else {
            $simpleXmlElemnet = $node;
        }
        foreach ($arr as $k => $v) {
            if (is_array($v)) {
                if ($k === "@attributes") {
                    foreach ($v as $kk => $vv) {
                        $simpleXmlElemnet->addAttribute($kk, $vv);
                    }
                } else {
                    if (!is_numeric($k)) {//数字的就不用加进去
                        Tools::arrtoxml($v, $simpleXmlElemnet, $k);//创建节点 并加在他的后面
                    } else {
                        Tools::arrtoxml($v, $simpleXmlElemnet->addChild($node1), $k);//创建节点 并加在他的后面
                    }
                }
            } else {
                if (!is_numeric($k)) {
                    $simpleXmlElemnet->addChild('item', $v);
                } else {
                    $simpleXmlElemnet->addChild($k, $v);
                }
            }
        }
        return $simpleXmlElemnet;
    }

    /**
     * 扫描所有的文件
     * @param $path
     * @return array|mixed|string
     */
    static function scanFile($path)
    {
        global $result;
        $files = scandir($path);
        foreach ($files as $k => $file) {
            if ($file != '.' && $file != '..') {
                if (is_dir($path . '/' . $file)) {
                    Tools::scanFile($path . '/' . $file);
                } else {
                    $result[$path] = basename($file);
                }
            }
        }
        return $result;
    }

    /**
     * 扫描所有的文件
     * @param $path
     * @return array|mixed|string
     */
    static function scanFilePlus($path, $limit = -1, $page = -1, &$allCount = 0)
    {
        global $result;
        $files = scandir($path);
        date_default_timezone_set('PRC');
        $files = array_values(array_diff_assoc($files, ['.', '..']));
        $allCount = count($files);
        foreach ($files as $k => $file) {
            if ($file != '.' && $file != '..') {
                if (is_dir($path . '/' . $file)) {
                    Tools::scanFilePlus($path . '/' . $file, $limit, $page, $allCount);
                } else {
                    if ($limit != -1 && $page != -1) {
                        $offset = ($page - 1) * $limit;
                    } else {
                        $offset = 0;
                    }
                    if ($offset + $limit > $k && $k >= $offset) {
                        $result[] = [
                            'id' => $k + 1,
                            'name' => basename($file),
                            'path' => $path,
                            'createtime' => filemtime($path . $file)
                        ];
                    }
                }
            }
        }
        return $result;
    }

    /**
     * 扫描某个文件
     * @param $path
     * @return array|mixed|string
     */
    static function scanOneFilePlus($path, $name)
    {
        $files = scandir($path);
        $res = '';
        foreach ($files as $k => $file) {
            if (basename($file) == $name) {
                $res = file_get_contents($path . $file);
                break;
            };
        }
        return $res;
    }

    /**
     * 写日志
     * @param $path
     * @param $str
     */
    public static function writeToLogPlus($path, $str)
    {
        $file = "./logs/" . \Yii::$app->user->id . '/';
        if (!file_exists($file)) {
            Tools::mkdirs($file);
        }
        $files = Tools::scanFilePlus($file);
        if ($files) {//有，表示不是第一次写日志
            $i = 0;
            foreach ($files as $k => $v) {
                if (filesize($v['path'] . $v['name']) < 1 * 1024) {//文件大小上限为1k
                    $i++;
                    $name = $v['name'];
                    break;
                }
            }
            if ($i == 0) {//表示需要新增一个文件，将原来的文件复制为备份，现在的文件名字仍然为logs
                $name = 'logs';
                copy($file . $name, $file . $name . count($files));//拷贝
                file_put_contents($file . $name, '');//新建一个logs文件
            }
        } else {//没有文件
            $name = "logs";
            file_put_contents($file . $name, '', FILE_APPEND);//新建一个文件
        }
        $res = json_decode(file_get_contents($file . $name), true);
        if ($res == null) {
            $res = [];
        }
        file_put_contents($file . $name, json_encode(array_merge($res, $str)));
    }

    /**
     * 得到ip地址
     */
    public static function ip()
    {
        //strcasecmp 比较两个字符，不区分大小写。返回0，>0，<0。
        if (getenv('HTTP_CLIENT_IP') && strcasecmp(getenv('HTTP_CLIENT_IP'), 'unknown')) {
            $ip = getenv('HTTP_CLIENT_IP');
        } elseif (getenv('HTTP_X_FORWARDED_FOR') && strcasecmp(getenv('HTTP_X_FORWARDED_FOR'), 'unknown')) {
            $ip = getenv('HTTP_X_FORWARDED_FOR');
        } elseif (getenv('REMOTE_ADDR') && strcasecmp(getenv('REMOTE_ADDR'), 'unknown')) {
            $ip = getenv('REMOTE_ADDR');
        } elseif (isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], 'unknown')) {
            $ip = $_SERVER['REMOTE_ADDR'];
        }
        $res = preg_match('/[\d\.]{7,15}/', $ip, $matches) ? $matches [0] : '';
        return $res;
    }


    /**
     *      把秒数转换为时分秒的格式
     * @param Int $times 时间，单位 秒
     * @return String
     */
    public static function secToTime($times){
        $result = '00:00:00';
        if ($times>0) {
            $hour = floor($times/3600);
            $minute = floor(($times-3600 * $hour)/60);
            $second = floor((($times-3600 * $hour) - 60 * $minute) % 60);
            if ($hour<=9){
                $hour = '0'.$hour;
            }
            if ($minute<=9){
                $minute = '0'.$minute;
            }
            if ($second<=9){
                $second = '0'.$second;
            }
            $result = $hour.':'.$minute.':'.$second;
        }
        return $result;

    }

}